package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.CheckGroupDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckGroup;
import com.itheima.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


/**
 * 检查组服务实现类
 *
 * @author ：zengjie
 * @date ：2020/11/9
 */
@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupDao checkGroupDao;

    /**
     * 新增检查组
     *
     * @param checkGroup   新增检查组的信息
     * @param checkItemIds 所有选择的关联检查项id
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkItemIds) {
        //先将新增检查组插入数据库
        //获取到新增检查组插入后的id值
        checkGroupDao.add(checkGroup);
        //在检查组检查项中间表插入关系数据
        this.setCheckGroupAndCheckItem(checkGroup.getId(), checkItemIds);
    }

    /**
     * 分页查询
     *
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //设置分页参数
        PageHelper.startPage(currentPage, pageSize);
        //执行查询语句
        Page<CheckGroup> page = checkGroupDao.selectByCondition(queryString);
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 删除检查组
     *
     * @param groupId
     */
    @Override
    public void deleteById(Integer groupId) {
        //查询是否存在检查组和检查项存在关联关系
        int count = checkGroupDao.findCheckGroupItemByGroupId(groupId);
        if (count > 0) {
            throw new RuntimeException(MessageConstant.DELETE_CHECKITEMGROUP_FAIL);
        }
        //查询检查组是否和套餐存在关联关系
        int count2 = checkGroupDao.findCheckGroupSetmealByGroupId(groupId);
        if (count2 > 0) {
            throw new RuntimeException(MessageConstant.DELETE_CHECKGROUPSETMEAL_FAIL);
        }
        //删除
        checkGroupDao.deleteById(groupId);
    }

    /**
     * 根据检查组id查询检查组对象
     */
    @Override
    public CheckGroup findById(Integer groupId) {

        return checkGroupDao.findById(groupId);
    }

    /**
     * 根据检查组id查询检查组检查项中间表
     * 获取检查项ids
     */
    @Override
    public List<Integer> findItemIdsByGroupId(Integer groupId) {
        return checkGroupDao.findItemIdsByGroupId(groupId);
    }

    /**
     * 编辑检查组
     */
    @Override
    public void edit(CheckGroup checkGroup, Integer[] checkItemIds) {
        //根据id修改检查组的信息
        checkGroupDao.edit(checkGroup);
        //删除检查组和检查项关联的所有数据
        checkGroupDao.deleteRsByGroupId(checkGroup.getId());
        //重新插入新的关联数据
        this.setCheckGroupAndCheckItem(checkGroup.getId(),checkItemIds);
    }

    /**
     * 查询所有检查组
     * @return
     */
    @Override
    public List<CheckGroup> findAll() {
        return checkGroupDao.findAll();
    }

    /**
     * 检查组检查项中间表插入关系数据
     */
    private void setCheckGroupAndCheckItem(Integer groupId, Integer[] checkItemIds) {
        if (checkItemIds != null && checkItemIds.length > 0) {
            //循环遍历检查项ids,插入数据库关系表
            for (Integer checkItemId : checkItemIds) {
                checkGroupDao.setCheckGroupAndCheckItem(groupId, checkItemId);
            }
        }
    }
}
